home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
COMMUNIC
/
H191.ZIP
/
CA29-3.EXE
/
BBMAINT2.CMD
< prev
next >
Wrap
OS/2 REXX Batch file
|
1992-03-24
|
24KB
|
907 lines
;**** TRACE ON ; Debugging
;
; ----- COM-AND BBS file maintenance script (Files file)
; Commenced: 11/90 R.McG
; -----------------------------------------------------------------------
; Purpose:
; The script, named BBMAINT2.CMD, produces the main window for
; Filedir functions of BBMAINT, and implements its functions. It
; is not directly callable itself.
; -----------------------------------------------------------------------
; Usage:
; N99 -> Text attribute value (Setup by BBMAINT.CMD)
; N98 -> BBMAINT Mainline cursor position
; N97 -> BBMAINT Mainline cursor position
; N96 -> our mainline cursor position
; N95 -> our mainline cursor position
; -----------------------------------------------------------------------
;
; This script is intended ONLY to be used for FCALL
;
IF NOT FCALLED
WOPEN 10,10,13,70 (cont) NOFIEsc
ATSAY 10,12 (cont) " BBS Files "
ATSAY 11,12 (cont) " The script: "*"_SCRIPT"
ATSAY 12,12 (cont) " is not used by itself... it is called through BBMAINT"
ATSAY 13,26 (cont) " Press any key to continue "
;
; Wait a keypress
;
KEYGET S0 ; Wait for any key
WCLOSE ; Close open window
EXIT ; Terminate right here
ENDIF
GOSUB FileFile ; Invoke function
FRETURN ; Return to caller
; -----------------------------------------------------------------------
; ----- NoFile: Inform that there's no BBS-FIle file to modify
;
NoFile:
WOPEN 10,10,13,70 (cont) NOFIEsc
ATSAY 10,12 (cont) " BBS FileDir "
ATSAY 11,12 (cont) " The file: "*S23&"\BBS-File"
ATSAY 12,12 (cont) " does not exist. Please create subdirectories first."
ATSAY 13,26 (cont) " Press any key to continue "
;
; Wait a keypress
;
KEYGET S0 ; Wait for any key
WCLOSE
NOFIEsc:
RETURN
; -----------------------------------------------------------------------
; ----- Subroutine: FileFile -> Update FILE directory
;
FileFile:
GOSUB NewFile ; Create if not there
IF NOT ISFILE S23&"\BBS-FIle"
GOSUB NoFile ; Inform there's no file
RETURN ; .. so we can't continue
ENDIF
;
; Open a window
;
WOPEN 0,0 23,79 (defa) File_Esc
ATSAY 0,2 (defa) " BBS Files "
ATSAY 23,25 (defa) " Press ESC to cancel BBMAINT "
;
; Paint the window
;
FIFI100:
CLEAR ; Clear window
LOCATE 2,2
MESS " 1) Add a file to the up/download list"
MESS " 2) Delete a file from the list"
MESS " 3) Modify a file's listing"
MESS " 4) Print the file list"
MESS " 5) View the file list"
MESS "──────────────────────────────────── "
MESS "Note: Alt-Q to edit a file"
MESS " Alt-F for a directory search"
MESS " Alt-F10 to shell to DOS"
MESS " "
MESS "──────────────────────────────────── "
MESS " "
MESS "Select item (carriage return = previous): "
CURSOR N96,N95 ; Read current cursor
;
; Wait for entry, and interpret
;
FIFI200:
LOCATE N96 N95 ; Reposition cursor
KEYGET S0 ; Wait for it
SWITCH S0 ; Act according to keyget
CASE "1"
GOSUB AddFile
ENDCASE
CASE "2"
GOSUB DelFile
ENDCASE
CASE "3"
GOSUB ModFile
ENDCASE
CASE "4"
GOSUB PrnFile
ENDCASE
CASE "5"
GOSUB ViewFile
GOTO FIFI100 ; Repaint after this
ENDCASE
CASE "0d" ; c/r alone is exit
WCLOSE ; Close window...
RETURN ; and return to caller
ENDCASE
CASE "_NULL" ; ESC -> Null
WCLOSE ; Close window...
RETURN ; Leave Main routine
ENDCASE
CASE "2100" ; Alt-F
MANUAL "0x2100" ; Perform Dir cmd
ENDCASE
CASE "1000" ; Alt-Q
MANUAL "0x1000" ; Edit a file
ENDCASE
CASE "7100" ; Alt-F10
SHELL
DWINDOW 1,2,22,78; Reset dwindow after shell
LEGEND "_LEGEND" ; Redo the legend
ENDCASE
DEFAULT ; None of the above
SOUND 100,100 ; Bronx cheer
ENDCASE
ENDSWITCH
GOTO FIFI200 ; Repaint screen and ask again
;
; End of Files procedure
;
File_Esc:
S0 = "" ; Fake null entry
RETURN ; Leave files routine
; -----------------------------------------------------------------------
; ----- AddFile: Add a file to the File directory
;
AddFile:
SET FLAG(0) OFF ; Flag for ESCAPE
WOPEN 10,10,16,75 (cont) ADFIEsc
ATSAY 10,12 (cont) " BBS Files Add "
ATSAY 11,12 (cont) "Enter the file to be added: "
ATSAY 16,26 (cont) " Press ESC to cancel "
;
; Wait a keypress
;
LOCATE 11,42
GET S0 12 ; get fname
IF FLAG(0) GOTO ADFIEnd ; Exit if ESC hit
LJ S0 ; Left justify - don't upper case
IF NULL S0 GOTO ADFIEnd ; get out on empty entry
GOSUB LkpFile ; Lookup name in files file
IF FOUND ; If its there we can't add it
WCLOSE ; Close open window
GOTO ModFI_Add ; Skip if file found
ENDIF
S10 = S0 ; Save File name
GOTO ADFI100 ; And branch around parallel code
;
; Entry from ModFile... Nothing to modify
;
AddFI_Mod:
WOPEN 10,10,16,75 (cont) ADFIEsc
ATSAY 10,12 (cont) " BBS Files Add "
ATSAY 11,12 (cont) "Enter the file to be added: "
ATSAY 11,42 (cont) S0
ATSAY 16,26 (cont) " Press ESC to cancel "
S10 = S0 ; Copy it for remainder
;
; Look for the file - Add date and size to listing
;
ADFI100:
FDATE S1 S23&"\"&S0 ; Ask for the file date (bbs-file subdir)
IF FAILED GOTO ADFI110 ; Skip if d.n.e
S10(12:19) = S1 ; Place date of file
FSIZE S1 S23&"\"&S0 ; Ask for the file size (bbs-file subdir)
IF FAILED GOTO ADFI110 ; Skip if d.n.e
S10(21:27) = S1 ; Place size of file (7 digits)
ATSAY 12,12 (cont) "File date and size:"
ATSAY 12,42 (cont) S10(12:27)
GOTO ADFI200 ; SKip around error handler
;
; File does not exist...
;
ADFI110:
ATSAY 12,12 (cont) "File d.n.e. Add anyway (y/n): "
LOCATE 12,42
GET S0 1 ; get resp
IF FLAG(0) GOTO ADFIEnd ; Exit if ESC hit
IF NULL S0 or NOT FIND "YN" S0(0)
SOUND 100,100 ; Indicate displeasure
GOTO ADFI110 ; Try again
ENDIF
IF FIND "N" S0(0)
WCLOSE ; Close window
GOTO AddFile ; And try again
ENDIF
S10(12:27) = "******** ********"
;
; Ask for a comment field
;
ADFI200:
ATSAY 13,12 (cont) "Comment text: "
LOCATE 13,26
GET S0 40 ; get resp
LJ S0 ; Left justify
IF FLAG(0) GOTO ADFIEnd ; Exit if ESC hit
IF NULL S0
SOUND 100,100 ; Indicate displeasure
GOTO ADFI200 ; Try again
ENDIF
S10(28:79) = S0 ; Save comment text
;
; Ask for privileged flag
;
ADFI250:
ATSAY 14,12 (cont) "Priveleged access (y/n): "
LOCATE 14,42
GET S0 1 ; get resp
IF FLAG(0) GOTO ADFIEnd ; Exit if ESC hit
IF NULL S0 or NOT FIND "YN" S0(0)
SOUND 100,100 ; Indicate displeasure
GOTO ADFI250 ; Try again
ENDIF
IF FIND "Y" S0(0) S10(20:20) = "P" ; Save priveleged access
;
; Ask for one more look
;
ADFI300:
ATSAY 15,12 (cont) "OK to add this record?: "
LOCATE 15,42
GET S0 1 ; get resp
IF FLAG(0) GOTO ADFIEnd ; Exit if ESC hit
IF NULL S0 or NOT FIND "YN" S0(0)
SOUND 100,100 ; Indicate displeasure
GOTO ADFI300 ; Try again
ENDIF
IF FIND "N" S0(0)
WCLOSE ; Close window
GOTO AddFile ; And try again
ENDIF
;
; Write the record
;
GOSUB AddFRec ; Write to Files file
;
; End of add procedure
;
ADFIEnd:
WCLOSE
ADFIEsc:
SET FLAG(0) ON
RETURN
; -----------------------------------------------------------------------
; ----- AddFRec: Add a record to the file file...
; .. S10 passes the record to be written
;
AddFRec:
FOPENO S23&"\BBS-File" TEXT APPEND
IF NOT SUCCESS ; Open failed
S0 = "Error opening: "*S23&"\BBS-File"
GOSUB Error ; Report
RETURN ; And we're done
ENDIF
PRESERVE S10 ; Preserve ^'s and !'s
WRITE S10 ; Write the record
WRITE "!^Z" ; And finish it
FCLOSEO
RETURN
; -----------------------------------------------------------------------
; ----- LkpFile: Lookup a file in the BBS-File file
; .. S0 passes the fname to be tested
; .. S10 returns the record read
;
LkpFIle:
FOPENI S23&"\BBS-File" TEXT
IF NOT SUCCESS ; Open failed
S0 = "Error opening: "*S23&"\BBS-File"
GOSUB Error ; Report
SET FOUND OFF ; Not found
RETURN ; And we're done
ENDIF
;
; Read loop
;
LOFI100:
READ S10 80 N0 ; Read a record
IF EOF GOTO LOFI200 ; Skip on EOF
IF STRCMP S10(0:0) "<" GOTO LOFI110
IF STRCMP S10(0:11) S0(0:11) GOTO LOFI300
;
; Record longer than 80 chars
;
LOFI110:
IF N0 LT 80 GOTO LOFI100; If exactly 80 rtnd, c/r wasn't read
READ S10 80 N0 ; Read remainder of rec
GOTO LOFI110 ; Read until less than 80
;
; We have end-of-file - not found
;
LOFI200:
SET FOUND OFF ; Indicate not found
GOTO LOFIEnd
;
; We have a hit - return found
;
LOFI300:
SET FOUND ON ; Indicate found
;
; And exit
;
LOFIEnd:
FCLOSEI
RETURN
; -----------------------------------------------------------------------
; ----- DelFile: Delete a file from Files file
;
DelFile:
SET FLAG(0) OFF ; Flag for ESCAPE
WOPEN 10,10,15,70 (cont) DEFIEsc
ATSAY 10,12 (cont) " BBS Files Delete "
ATSAY 11,12 (cont) "Enter the file to be deleted: "
ATSAY 15,26 (cont) " Press ESC to cancel "
;
; Wait a keypress
;
LOCATE 11,42
GET S0 12 ; get resp
IF FLAG(0) GOTO DEFIEnd ; Exit if ESC hit
LJ S0 ; Left justify - don't upper case
IF NULL S0 GOTO DEFIEnd ; get out on empty entry
;
; Open the File file and a temp copy file
;
GOSUB DelFRec ; Try to delete a record
IF FLAG(1) GOTO DEFIEnd ; Skip if record deleted
ATSAY 12,12 (cont) "File not in listing... "
ATSAY 13,12 (cont) "Press any key to continue..."
KEYGET S0
;
; End of add procedure
;
DEFIEnd:
WCLOSE
DEFIEsc:
SET FLAG(0) ON
RETURN
; -----------------------------------------------------------------------
; ----- DelFRec: Delete a record from the Files file...
; .. S0 passes the File name key
; .. S1 destroyed in the process
; .. FLAG(1) if rtn'd set, indicates record was FOUND
;
DelFRec:
;
; Open the Files file and a temp copy file
;
SET FLAG(1) OFF ; Initialize for found flag
FOPENI S23&"\BBS-File" TEXT
IF NOT SUCCESS ; Open failed
S0 = "Error opening: "*S23&"\BBS-File"
GOSUB Error ; Report
GOTO DEFREnd ; And we're done
ENDIF
FOPENO S23&"\TempFile" TEXT
IF NOT SUCCESS ; Open failed
S0 = "Error opening: "*S23&"\TempFile"
GOSUB Error ; Report
GOTO DEFREnd ; And we're done
ENDIF
N10 = 0 ; Count recs written
;
; Read records (40 chars at a time to allow PRESERVE)
;
DEFR100:
READ S1 40 N0 ; Read 1st 40 chars
IF EOF GOTO DEFR300 ; Skip on EOF
IF STRCMP S1(0:11) S0(0:11) GOTO DEFR200
INC N10
;
; Copy the record read to the output file
;
DEFR110:
PRESERVE S1 ; Save !'s and ^'s
WRITE S1 ; Write text
IF N0 LT 40 ; If we wrote end of record
WRITE "!" ; Finish w/cr/lf
GOTO DEFR100 ; And continue copying
ENDIF
READ S1 40 N0 ; Read remainder of rec
IF NOT EOF GOTO DEFR110 ; Skip if not eof
WRITE "!" ; Finish record
GOTO DEFR300 ; End of file
;
; We have a hit
;
DEFR200:
SET FLAG(1) ON ; Flag we deleted item
IF N0 LT 40 GOTO DEFR100
READ S1 40 N0 ; Read remainder of rec
IF NOT EOF GOTO DEFR200 ; Skip if not found
;
; We hit EOF - may or may not have found the target rec
;
DEFR300:
IF NOT FLAG(1) GOTO DEFR400 ; skip if not found
WRITE "^Z" ; Finish ASCII file
FCLOSEO ; Close output
FCLOSEI ; Close input
DELETE S23&"\BBS-File" ; Delete original
RENAME S23&"\TempFile" S23&"\BBS-File"
IF ZERO N10 DELETE S23&"\BBS-File" ; Delete empty file
GOTO DEFREnd
;
; We hit EOF - we did not find the record
;
DEFR400:
FCLOSEO ; Close output
FCLOSEI ; Close input
DELETE S23&"\TempFile" ; Delete copy file
;
; End of procedure...
;
DEFREnd:
RETURN
; -----------------------------------------------------------------------
; ----- ModFile: Modify a file in the Files file
;
ModFile:
SET FLAG(0) OFF ; Flag for ESCAPE
WOPEN 10,10,17,75 (cont) MOFIEsc
ATSAY 10,12 (cont) " BBS Files Modify "
ATSAY 11,12 (cont) "Enter the fname to change: "
ATSAY 17,26 (cont) " Press ESC to cancel "
;
; Wait a keypress
;
LOCATE 11,42
GET S0 12 ; get resp
IF FLAG(0) GOTO MOFIEnd ; Exit if ESC hit
LJ S0 ; Left justify - don't upper case
IF NULL S0 GOTO MOFIEnd ; get out on empty entry
GOSUB LkpFile ; Lookup File in Files file
IF NOT FOUND ; If its there we can't add it
WCLOSE ; Close open window
GOTO AddFI_Mod ; Skip if NOT found
ENDIF
GOTO MOFI100 ; And branch around parallel code
;
; Entry from AddFile... We have a rec in S10 - needs adding
;
ModFI_Add:
WOPEN 10,10,17,75 (cont) MOFIEsc
ATSAY 10,12 (cont) " BBS Files Modify "
ATSAY 11,12 (cont) "Enter the File to change: "
ATSAY 11,42 (cont) S0
ATSAY 17,26 (cont) " Press ESC to cancel "
;
; Display the original values (rtnd in S10 by LkpFile)
;
MOFI100:
ATSAY 10,54 (cont) " Old vals "
ATSAY 11,55 (cont) S10(0:11)
ATSAY 12,55 (cont) S10(12:19)*" "*S10(21:27)
ATSAY 14,26 (cont) S10(28:79)
IF NOT NULL S10(20:20)
ATSAY 15,55 (cont) "y"
ELSE
ATSAY 15,55 (cont) "n"
ENDIF
;
; Look for the file - Add date and size to listing
;
FDATE S1 S23&"\"&S0 ; Ask for the file date (bbs-file subdir)
IF FAILED GOTO MOFI110 ; Skip if d.n.e
S10(12:19) = S1 ; Place date of file
FSIZE S1 S23&"\"&S0 ; Ask for the file size (bbs-file subdir)
IF FAILED GOTO MOFI110 ; Skip if d.n.e
S10(21:27) = S1 ; Place size of file (7 digits)
ATSAY 12,12 (cont) "File date and size:"
ATSAY 12,33 (cont) S10(12:19)*" "*S10(21:27)
GOTO MOFI200 ; SKip around error handler
;
; File does not exist...
;
MOFI110:
ATSAY 12,12 (cont) "File d.n.e. Add anyway (y/n): "
LOCATE 12,42
GET S0 1 ; get resp
IF FLAG(0) GOTO MOFIEnd ; Exit if ESC hit
IF NULL S0 or NOT FIND "YN" S0(0)
SOUND 100,100 ; Indicate displeasure
GOTO MOFI110 ; Try again
ENDIF
IF FIND "N" S0(0)
WCLOSE ; Close window
GOTO ModFile ; And try again
ENDIF
S10(12:27) = "******** ********"
;
; Ask for a comment field
;
MOFI200:
ATSAY 13,12 (cont) "Comment text: "
LOCATE 13,26
GET S0 40 ; get resp
LJ S0 ; Left justify
IF FLAG(0) GOTO MOFIEnd ; Exit if ESC hit
IF NULL S0 ; If null entry...
ATSAY 13,26 (cont) S10(28:67)
GOTO MOFI250 ; Skip store
ENDIF
S10(28:79) = S0 ; Save comment text
;
; Ask for privileged flag
;
MOFI250:
ATSAY 15,12 (cont) "Priveleged access (y/n): "
LOCATE 15,42
GET S0 1 ; get resp
IF FLAG(0) GOTO MOFIEnd ; Exit if ESC hit
IF NULL S0 ATSCR 13,55 1 S0 ; Read back previous value
IF NOT FIND "YN" S0(0) ; If not y/n
SOUND 100,100 ; Indicate displeasure
GOTO MOFI250 ; Try again
ENDIF
S10(20:20) = " " ; Default no priv
IF FIND "Y" S0(0) ; If privilege 'y'
S10(20:20) = "P" ; Set priveleged access
ENDIF
;
; Ask for one more look
;
MOFI300:
ATSAY 16,12 (cont) "OK to add this record?: "
LOCATE 16,42
GET S0 1 ; get file
IF FLAG(0) GOTO MOFIEnd ; Exit if ESC hit
IF NULL S0 or NOT FIND "YN" S0(0)
SOUND 100,100 ; Indicate displeasure
GOTO MOFI300 ; Try again
ENDIF
IF FIND "N" S0(0)
WCLOSE ; Close window
GOTO ModFile ; And try again
ENDIF
;
; Delete the previous value... and add the new
; .. Could do a Delete/add but don't want file re-ordered
;
GOSUB ModFRec ; Delete the previous key
IF NOT FLAG(1) ; If not deleted
S0 = "Error modifying record for: "*S0
GOSUB Error ; Report
GOTO MOFIEnd ; And we're done
ENDIF
;
; End of add procedure
;
MOFIEnd:
WCLOSE
MOFIEsc:
SET FLAG(0) ON
RETURN
; -----------------------------------------------------------------------
; ----- ModFRec: Modify a record from the Files file...
; .. S10 passes the new record (same file name key)
; .. S1 destroyed in the process
;
ModFRec:
;
; Open the Files file and a temp copy file
;
SET FLAG(1) OFF ; Initialize for found flag
FOPENI S23&"\BBS-File" TEXT
IF NOT SUCCESS ; Open failed
S0 = "Error opening: "*S23&"\BBS-File"
GOSUB Error ; Report
GOTO MOFREnd ; And we're done
ENDIF
FOPENO S23&"\TempFile" TEXT
IF NOT SUCCESS ; Open failed
S0 = "Error opening: "*S23&"\TempFile"
GOSUB Error ; Report
GOTO MOFREnd ; And we're done
ENDIF
N10 = 0 ; Count recs written
;
; Read records (40 chars at a time to allow PRESERVE)
;
MOFR100:
READ S1 40 N0 ; Read 1st 40 chars
IF EOF GOTO MOFR300 ; Skip on EOF
IF STRCMP S1(0:11) S10(0:11) GOTO MOFR200
INC N10
;
; Copy the record read to the output file
;
MOFR110:
PRESERVE S1 ; Save !'s and ^'s
WRITE S1 ; Write text
IF N0 LT 40 ; If we wrote end of record
WRITE "!" ; Finish w/cr/lf
GOTO MOFR100 ; And continue copying
ENDIF
READ S1 40 N0 ; Read remainder of rec
IF NOT EOF GOTO MOFR110 ; Skip if not eof
WRITE "!" ; Finish record
GOTO MOFR300 ; End of file
;
; We have a match on the key.
;
MOFR200:
SET FLAG(1) ON ; Flag we deleted item
S1 = S10(0:39) ; Take 1st part of rec to write
PRESERVE S1 ; Save !s and ^s
WRITE S1 ; Write text
LENGTH S10 N1 ; Get new rec length
IF N1 LT 40 GOTO MOFR210
S1 = S10(40:79) ; Take 2nd part of rec to write
PRESERVE S1 ; Save !s and ^s
WRITE S1 ; Write text
;
; Finish the new record
;
MOFR210:
WRITE "!" ; Finish record
;
; Finish reading the original record
;
MOFR220:
IF N0 LT 40 GOTO MOFR100
READ S1 40 N0 ; Read remainder of rec
IF NOT EOF GOTO MOFR220 ; Skip if not found
;
; We hit EOF - may or may not have found the target rec
;
MOFR300:
IF NOT FLAG(1) GOTO MOFR200 ; skip if not found
WRITE "^Z" ; Finish ASCII file
FCLOSEO ; Close output
FCLOSEI ; Close input
DELETE S23&"\BBS-File" ; Delete original
RENAME S23&"\TempFile" S23&"\BBS-File"
IF ZERO N10 DELETE S23&"\BBS-File" ; Delete empty file
;
; End of procedure...
;
MOFREnd:
RETURN
; -----------------------------------------------------------------------
; ----- PrnFIle: Print a file listing
;
PrnFile:
FOPENI S23&"\BBS-File" TEXT
IF NOT SUCCESS ; Open failed
S0 = "Error opening: "*S23&"\BBS-File"
GOSUB Error ; Report
RETURN ; And we're done
ENDIF
;
; Initialize a counter
;
N10 = 0 ; # Lines printed
N11 = 1 ; Page number
;
; Read loop
;
PRFI100:
READ S10 80 N0 ; Read a record
IF EOF GOTO PRFI200 ; Skip on EOF
IF STRCMP S10(0:0) "*" GOTO PRFI120 ; skip comments
IF ZERO N0 GOTO PRFI100 ; skip blank lines
;
; Print a heading...
;
IF N10 GT 0 and N10 LE 50 GOTO PRFI110
PRINT "COM-AND Scripted BBS File list as of "*"_DATE"*", "*"_TIME"*" Page "*N11*"^M^J"
PRINT "From: "*"_IFILE"*"^M^J"
PRINT "---------------------------------------------------------------------^M^J"
PRINT "Name Priv Date Size Description^M^J"
PRINT "------------ ---- -------- ------- ----------------------------------^M^J"
N10 = 0
INC N11
;
; Build a record and print it
;
PRFI110:
S0 = S10(0:11) ; File name
IF NOT NULL S10(20:20) S0(14:16) = "yes"
S0(18:79) = S10(12:19) ; Date
S0(27:79) = S10(21:27) ; size
S0(35:79) = S10(28:79) ; comment field
PRESERVE S0
PRINT S0
PRINT "^M^J" ; FInish line
INC N10 ; COunt lines printed
;
; Handle record longer than 80 chars
;
PRFI120:
IF N0 LT 80 GOTO PRFI100; If exactly 80 rtnd, c/r wasn't read
READ S10 80 N0 ; Read remainder of rec
GOTO PRFI120 ; Read until less than 80
;
; We have end-of-file
;
PRFI200:
PRINT "^L" ; Do a final top-of-form
;
; And exit
;
PRFIEnd:
FCLOSEI
RETURN
; -----------------------------------------------------------------------
; ----- ViewFile: View a list of files
;
ViewFile:
FOPENI S23&"\BBS-File" TEXT
IF NOT SUCCESS ; Open failed
S0 = "Error opening: "*S23&"\BBS-File"
GOSUB Error ; Report
RETURN ; And we're done
ENDIF
;
; Initialize a counter
;
N10 = 0 ; # Lines printed
N11 = 0 ; Page number
SET FLAG(0) OFF ; Initialize esc flag
S11 = "_ONESC"
ON ESCAPE GOSUB VIFIESC
;
; Print a heading...
;
VIFI100:
IF N10 GT 0 GOTO VIFI110
CLEAR ; Clear the window
ATSAY 1,2 (defa) "Name Priv Date Size Description"
ATSAY 2,2 (defa) "------------ ---- -------- ------- ----------------------------------"
N10 = 3 ; Set starting line no
INC N11 ; Set next page
;
; Save the file position for the start of this page
;
FSAVEI
IF NOT SUCCESS
FSAVEI SHIFT ; Save last 20 pos'ns
FSAVEI
ENDIF
;
; Read loop
;
VIFI110:
READ S10 80 N0 ; Read a record
IF EOF GOTO VIFI200 ; Skip on EOF
IF STRCMP S10(0:0) "*" GOTO VIFI120 ; skip comments
IF ZERO N0 GOTO VIFI110 ; skip blank lines
;
; Build a record and print it
;
S0 = S10(0:11) ; File name
IF NOT NULL S10(20:20) S0(14:16) = "yes"
S0(18:74) = S10(12:19) ; Date
S0(27:74) = S10(21:27) ; size
S0(35:74) = S10(28:79) ; comment field
PRESERVE S0
ATSAY N10,2 (defa) S0
INC N10 ; COunt lines printed
;
; Handle record longer than 80 chars
;
VIFI120:
IF N0 LT 80 GOTO VIFI200; If exactly 80 rtnd, c/r wasn't read
READ S10 80 N0 ; Read remainder of rec
GOTO VIFI120 ; Read until less than 80
;
; Look for end of screen/end of file
;
VIFI200:
IF (NOT EOF) and N10 LT 21 GOTO VIFI100
IF EOF
ATSAY 22,2 (defa) "End of file; Home (top), PgDn (forward), PgUp (back)"
ELSE
ATSAY 22,2 (defa) "Page "*N11*"; Home (top), PgDn (forward), PgUp (back)"
ENDIF
;
; Read a key and interpret
;
VIFI210:
IF FLAG(0) RETURN ; End of routine when flag set
KEYGET S1
IF FLAG(0) RETURN ; End of routine when flag set
SWITCH S1
CASE "4900" ; Pgup
GOTO PgUp
ENDCASE
CASE "5100" ; PgDn
GOTO PgDn
ENDCASE
CASE "4700" ; Home
GOTO Home
ENDCASE
CASE "0D" ; C/r
IF EOF GOTO VIFIEnd
GOTO PgDn
ENDCASE
CASE "2100" ; Alt-F
MANUAL "0x2100" ; Perform Dir cmd
ENDCASE
CASE "1000" ; Alt-Q
MANUAL "0x1000" ; Edit a file
ENDCASE
CASE "7100" ; Alt-F10
SHELL
DWINDOW 1,2,22,78 ; Reset dwindow after shell
LEGEND "_LEGEND" ; Redo the legend
ENDCASE
DEFAULT
MESS S1
SOUND 100,100
ENDCASE
ENDSWITCH
GOTO VIFI210
;
; Page up (go backwards)
;
PgUp:
N10 = 0 ; Clear line ctr
FRESTOREI ; Backup current pg
N11 = N11-1 ; Reset Page # for redisplay
FRESTOREI ; Backup one more
IF NOT SUCCESS
SOUND 200,100 ; Indicate problem
GOTO Home
ENDIF
N11 = N11-1 ; Reset Page # for redisplay
GOTO VIFI100
;
; Home (go to top)
;
Home:
N10 = 0 ; Clear line ctr
N11 = 0 ; Set new pg number
FSAVEI CLEAR ; Clear saved pages
REWIND ; Rewind input
GOTO VIFI100
;
; Page down (go forwards)
;
PgDn:
IF EOF GOTO Home ; Wrap to home at EOF
N10 = 0 ; Clear line ctr
GOTO VIFI100
;
; And exit
;
VIFIEnd:
FCLOSEI
RETURN
;
; Escape entered
;
VIFIESC:
SET FLAG(0) ON
ON ESCAPE GOSUB S11 ; Restore previous ON ESC
RETURN
; -----------------------------------------------------------------------
; ----- Subroutine: NewFile -> Create a new BBS-File file
;
NewFile:
IF ISFILE S23&"\BBS-File" RETURN
FOPENO S23&"\BBS-File" TEXT
IF NOT SUCCESS RETURN ; Open failed
WRITE "!^Z" ; Make it empty
FCLOSEO ; Done with it
RETURN
; -----------------------------------------------------------------------
; ----- Error: Open a window, display a message, and wait for keypress
; S0 passes the error message
;
Error:
WOPEN 10,10,12,70 (cont) Err_Esc
ATSAY 10,12 (cont) " Error "
ATSAY 11,12 (cont) S0(0:55); Max msg width 55 chars
ATSAY 12,26 (cont) " Press any key to continue "
;
; Wait a keypress
;
KEYGET S0 ; Wait for any key
WCLOSE
Err_Esc:
RETURN